package com.banyuan.project_atm;

import java.util.Scanner;

public class Atm {
    Scanner in = new Scanner(System.in);
    BankServer bankServer = new BankServer();
    int[] arr = new int[2];
    int[] passwordC = new int[1];

    public void welWindow() {
        System.out.println("------欢迎使用半圆土嗨ATM系统------");
        bankServer.initialize1();
        bankServer.initialize2();
        cardnoWindow();
    }

    public void cardnoWindow() {
        System.out.println("--------------------------------------");
        System.out.println("请输入帐号:");
        String cardno = in.next();
        String result = bankServer.checkCarno(cardno);
//        System.out.println(result);
        if (result.equals("帐号不存在!")) {
            System.out.println("账号不存在！请重新输入：");
            cardnoWindow();
        }
        //正确->输入密码
        passwordWindow();
    }

    public void passwordWindow() {
        passwordC[0] = 0;
        System.out.println("--------------------------------------");
        functionCheckPassword();
        mainWindow();
    }

    //密码校验的功能
    public void functionCheckPassword() {
        //判断密码输入次数，如果次数等于三则不让操作
        if (passwordC[0] >= 3) {
            System.out.println("输入密码次数过多，操作锁定！");
            lockedWindow();
        }
        System.out.println("请输入密码:");
        String password = in.next();
        //校验密码
        String result = bankServer.checkPassword(password);
        if (result.equals("密码不正确！")) {
            System.out.println("密码不正确，请重新输入：");
            passwordC[0]++;
            functionCheckPassword();
        }
    }

    public void mainWindow() {
        System.out.println("--------------------------------------");
        System.out.println("请选择你要服务的项目：");
        System.out.println("1、查询；");
        System.out.println("2、取钱；");
        System.out.println("3、存钱；");
        System.out.println("4、转账；");
        String s = in.next();
        switch (s) {
            case "查询":
                queryMoneyWindow();
                break;
            case "取钱":
                getMoneyWindow();
                break;
            case "存钱":
                putMoneyWindow();
                break;
            case "转账":
                transferMoneyWindow();
                break;
            default:
                System.out.println("本行还未开通该项目，或者您输入的项目名称不对，请重新输入：");
                mainWindow();
                //设置一个数，记录操作的次数，如果超过固定的次数就赚到帮助界面；
        }
    }

    //查询界面
    public void queryMoneyWindow() {
        System.out.println("--------------------------------------");
        windowFormat("查询", "输入\"查询\"查询当前余额；");
        functionQueryMoneyWindow();

    }

    //查询方法的嵌套
    public void functionQueryMoneyWindow() {
        String stringQ = in.next();
        switch (stringQ) {
            case "查询":
                System.out.println(bankServer.queryMoney());
                System.out.println("请选择你的操作（\"查询\"，\"返回\"，\"退出\"）：");
                functionQueryMoneyWindow();
                break;
            case "返回":
                mainWindow();
                break;
            case "退出":
                welWindow();
                break;
            default:
                System.out.println("输入的指令有误请重新输入!");
                queryMoneyWindow();
                break;
        }

    }

    //取钱界面
    public void getMoneyWindow() {
        arr[1] = 0;
        System.out.println("--------------------------------------");
        windowFormat("取钱", "输入\"取钱\"将进入取钱功能；");
        functionGetMoney();

    }

    //取钱的功能嵌套
    public void functionGetMoney() {
        String stringF = in.next();
        int iGut = 0;
        switch (stringF) {
            case "取钱":
                functionCheckMoney("取出");
                iGut = arr[1];
                bankServer.getMoney(iGut);
                System.out.println("取钱操作成功！");
                bankServer.showMoney();
                printVoucherChoose("取出金额", arr[1]);
                getMoneyWindow();
                break;
            case "返回":
                mainWindow();
                break;
            case "退出":
                welWindow();
                break;
            default:
                System.out.println("输入的指令有误请重新输入!");
                getMoneyWindow();
                break;
        }
    }


    //存钱界面
    public void putMoneyWindow() {
        System.out.println("--------------------------------------");
        windowFormat("存钱", "输入\"存钱\"请将纸币放入钞票口；");
        arr[0] = 0;
        functionPutMoney();
    }

    //存钱的功能
    public void functionPutMoney() {
        String stringFM = in.next();
        switch (stringFM) {
            case "存钱":
                checkPutMoney();
            case "返回":
                mainWindow();
                break;
            case "退出":
                welWindow();
                break;
            default:
                System.out.println("输入的指令有误请重新输入!");
                putMoneyWindow();
                break;
        }
    }

    //存钱的额一个校验功能，输入错误的数字会返回该界面，但是之前的存的钱会保留；
    public void checkPutMoney() {
        System.out.print("请输入存款金额（100的正整数倍）：");
        String stringPutMoney = in.next();
        if (!checkNumberStyle(stringPutMoney)) {
            System.out.println("输入的格式不对！");
            checkPutMoney();
        } else {
            int intStringPutMoney = Integer.valueOf(stringPutMoney);
            arr[0] = intStringPutMoney;
            System.out.println("请选择\"结束放钞\"或者\"继续放钞\"；");
            functionPutAction(arr);
            bankServer.putMoney(arr[0]);
            System.out.println("存钱成功！");
            bankServer.showMoney();
            //打印凭条
            printVoucherChoose("存入金额", arr[0]);
            putMoneyWindow();
        }
    }

    //存钱的动作，一定要结束放钞之后才能退出该功能；
    public void functionPutAction(int[] arr) {
        String stringFA = in.next();
        int temp;
        switch (stringFA) {
            case "继续放钞":
                System.out.println("请输入存放的金额：");
                temp = in.nextInt();
                arr[0] += temp;
                System.out.println("请选择结束放钞或者继续放钞；");
                functionPutAction(arr);
                break;

            case "结束放钞":
                break;

            default:
                System.out.println("输入的命令有误，请重新输入：");
                functionPutAction(arr);

        }
    }


    //转账界面
    public void transferMoneyWindow() {
        arr[1] = 0;
        bankServer.initialize2();
        System.out.println("--------------------------------------");
        windowFormat("转账", "输入\"转账\"进入转账功能，请输入的转账人的账户；");
        functionTransferMoney();


    }

    public void functionTransferMoney() {
        String stringFTM = in.next();
        switch (stringFTM) {
            case "转账":
//                System.out.println("转账");
                String id = functionCheckId();
                functionCheckMoney("转账");
                int money = arr[1];
                functionTransferChoose(id, money);
                break;
            case "返回":
                mainWindow();
                break;
            case "退出":
                welWindow();
                break;
            default:
                System.out.println("输入的指令有误请重新输入!");
                transferMoneyWindow();
                break;
        }


    }

    //账户和金额符合要求时确认是否转账,选择的界面
    public void functionTransferChoose(String s, int i) {
        System.out.println("输入\"是\"将进行转账；");
        System.out.println("输入\"否\"将重新进入转账界面；");
        String stringCheckTransfer = in.next();
        switch (stringCheckTransfer) {
            case "是":
                bankServer.transferMoney(s, i);
                System.out.println("转账成功");
                bankServer.showMoney();
                printVoucherChoose(("向" + bankServer.getTransferId() + "转账"), arr[1]);
                transferMoneyWindow();
                break;
            case "否":
                transferMoneyWindow();
                break;
            default:
                System.out.println("输入格式有误，请重新输入：");
                functionTransferChoose(s, i);
        }
    }


    //转账的账户的确认
    public String functionCheckId() {
        System.out.println("请输入转账账号：");
        String stringFCI = in.next();
        String check = bankServer.checkAccount1(stringFCI);
        String check1 = bankServer.checkOne(stringFCI);
        if (check.equals("账号不存在!") || check1.equals("相同")) {
            System.out.println("账号不存在！");
            System.out.println("请不要自己给当前账号转账！");
            functionCheckIdChoose();
        }
        return stringFCI;
    }


    //进入转账的账户不对时的选择界面
    public void functionCheckIdChoose() {
        System.out.println("请选择\"重新输入帐号\"或者\"返回转账界面\"；");
        String stringFCIC = in.next();
        switch (stringFCIC) {
            case "重新输入账号":
                functionCheckId();
                break;
            case "返回转账界面":
                transferMoneyWindow();
                break;
            default:
                System.out.println("格式不对！");
                functionCheckIdChoose();
        }
    }

    //转账和取钱金额的数值的判断
    public void functionCheckMoney(String s) {
        System.out.println("请输入" + s + "金额（100的正倍数）：");
        String transferMoney = null;
        transferMoney = in.next();
        //判断是否为int型字符串,如果不是返回到输入界面；
        if (!checkNumberStyle(transferMoney)) {
            System.out.println("输入的类型不对！");
            functionCheckMoney(s);
        } else {
            int intTransferMoney = Integer.valueOf(transferMoney);

            String stringBCM = bankServer.checkMoney(intTransferMoney);
            if (stringBCM.equals("余额不足！")) {
                System.out.println("余额不足！");
                functionCheckMoneyChoose(s);
            } else if (stringBCM.equals("余额充足！")) {
                arr[1] = intTransferMoney;
            }
        }

    }

    //进入转账金额不足时的选择界面
    public void functionCheckMoneyChoose(String s) {
        System.out.println("请选择\"重新输入金额\"或者\"返回转账界面\"；");
        String stringFCIC = in.next();
        switch (stringFCIC) {
            case "重新输入金额":
                functionCheckMoney(s);
                break;
            case "返回转账界面":
                transferMoneyWindow();
                break;
            default:
                System.out.println("输入的格式不对；");
                functionCheckMoneyChoose(s);
        }
    }


    //窗口的固定格式
    public void windowFormat(String s1, String s2) {
        System.out.println("欢迎来到" + s1 + "界面！");
        System.out.println(s2);
        System.out.println("输入\"返回\"将回到主界面；");
        System.out.println("输入\"退出\"将退出账号");
    }

    //是否打印凭条
    public void printVoucherChoose(String s, int money) {
        System.out.println("操作成功，请选择是否打印凭条；");
        System.out.println("输入\"是\"将打印凭条，输入\"否\"将返回到存钱界面；");
        String stirngPVC = in.next();
        switch (stirngPVC) {
            case "是":
                bankServer.printVoucher(s, money);
                break;
            case "否":
                break;
            default:
                System.out.println("输入的命令错误，请重新输入：");
                printVoucherChoose(s, money);
        }
    }

    //锁定界面
    public void lockedWindow() {
        System.out.println("--------------------------------------");
        System.out.println("操作锁定界面，联系管理员解锁；");
        System.exit(0);
    }

    //判断字符串是否为int型
    public boolean isInt(String s) {
        char[] arr = s.toCharArray();
        boolean flag = true;
        for (char c : arr) {
            int i = (int) c;
            if (c < 48 || c > 57) {
                flag = false;
                return false;
            }
        }

        if (flag) {
            return true;
        }
        return false;
    }

    //判断输入的数是不是100的倍数的正数
    public boolean is100(int i) {
        return i > 0 && i % 100 == 0;
    }

    //检测输入的字符串是不是100的正整数
    public boolean checkNumberStyle(String s) {
        if (!isInt(s)) {
            return false;
        }
        ;
        int i = Integer.valueOf(s);
        if (!is100(i)) {
            return false;
        }
        return true;
    }
}
